﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpModelInterface.h"
#include "IDbObject.h"

struct RegenDataId;
namespace gcmp
{
    class IDocument;
    class IElement;
    class IParameterBinding;
    class IParameter;
    

    /// \brief 参数绑定接口类
    FINAL_INTERFACE class GCMP_MODEL_INTERFACE_EXPORT IElementParameterBindings : public IDbObject
    {
        DEFINE_CAST_DERIVED(gcmp::IElementParameterBindings, gcmp::IDbObject);

    public:

        /// \brief 返回参数绑定接口对象
        ///
        /// \param pDocument 文档指针
        /// \param ownerElementId 参数绑定接口对象的拥有者
        /// \return 参数绑定接口对象
        static OwnerPtr<IElementParameterBindings> CreateDefaultBehavior(IDocument* pDocument, const ElementId& ownerElementId);

        /// \brief 设置该行为所属Element
        /// \param pOwnerElement 所属Element
        /// \return bool
        virtual bool SetOwnerElement(IElement* pOwnerElement) = 0;

        /// \brief 获得该外部对象所属Element
        /// \return const IElement* 所属Element
        virtual const IElement* GetOwnerElement() const = 0;

        /// \brief 获得该外部对象所属Element
        /// \return IElement* 所属Element
        virtual IElement* GetOwnerElement() = 0;

        /// \brief 改变参数绑定信息
        ///
        ///  将给定参数绑定到sourceParameterDefinitionId
        /// \param parameterDefinitionId 被驱动参数参数定义Id
        /// \param sourceParameterDefinitionId 新驱动参数的参数定义Id
        /// \param sourceElementId 新驱动参数所属的文档元素Id
        /// \return 成功返回true，否则false
        virtual bool ChangeParameterBinding(int parameterDefinitionId, int sourceParameterDefinitionId, const ElementId& sourceElementId) = 0;

        /// \brief 添加参数绑定信息
        ///
        /// \param parameterDefinitionId 被驱动参数的参数定义Id
        /// \param sourceParameterDefinitionId 驱动参数的参数定义Id
        /// \param sourceElementId 驱动参数所属的文档元素的Id，若绑定的为类型参数，则为Type所属元素的Id
        /// \param isBindingTypeParameter 参数绑定是否绑定了类型参数
        /// \return 成功返回true，否则false
        virtual bool AddParameterBinding(int parameterDefinitionId, int sourceParameterDefinitionId, const ElementId& sourceElementId, bool isBindingTypeParameter) = 0;

        /// \brief 移除参数绑定信息
        ///
        /// \param parameterDefinitionId  被驱动参数的参数定义Id
        /// \return 成功返回true，否则false
        virtual bool DeleteParameterBinding(int parameterDefinitionId) = 0;

        /// \brief 返回当前参数绑定对象中的所有参数绑定信息
        ///
        /// \return 参数绑定信息数组
        virtual const std::vector<OwnerPtr<IParameterBinding>>& GetParameterBindings() const = 0;

        /// \brief 返回给定参数的绑定信息
        ///
        /// \param parameterDefinitionId  被驱动参数的参数定义Id
        /// \return 参数绑定信息
        virtual const IParameterBinding* GetParameterBinding(int parameterDefinitionId) const = 0;

        /// \brief 获取给定参数，并将驱动参数的参数值设置到该参数
        ///
        /// \param parameterDefinitionId  参数定义Id
        /// \return 参数
        virtual OwnerPtr<IParameter> ComputeBoundTargetParameter(int parameterDefinitionId) const = 0;

        /// \brief 根据绑定信息，更新文档模型
        ///
        /// \return 成功返回true，否则false
        virtual bool RegenerateAllBoundTargetParameters() = 0;

        /// \brief 返回给定参数对应的驱动参数Id
        ///
        /// \param parameterDefinitionId  参数定义Id
        /// \return 驱动参数Id
        virtual int GetBindingSourceParameterDefinitionId(int parameterDefinitionId) const = 0;

        /// \brief 返回给定参数对应的关联更新数据
        ///
        /// \param parameterId  参数Id
        /// \return 关联更新数据
        virtual RegenDataId GetParameterBindingRdId(int parameterId) const = 0;

        /// \brief 标记给定参数的关联更新数据，为数据更新做好准备
        ///
        /// \param parameterId  参数Id
        /// \return void
        virtual void MarkParameterBindingRdId(int parameterId) const = 0;

        /// \brief 获取绑定参数。
        /// 
        /// \param parameterDefinitionId  参数定义Id。
        /// \return 绑定的参数。
        virtual OwnerPtr<IParameter> GetParameterByParameterDefinitionId(int parameterDefinitionId) const = 0;

        /// \brief 获取关联更新数据。
        ///
        /// \param parameterDefinitionId  参数定义Id。
        /// \return 关联更新数据。
        virtual std::vector<RegenDataId> GetParameterRdIdsByParameterDefinitionId(int parameterDefinitionId) const = 0;

        /// \brief 返回类型参数绑定的关联更新数据
        ///
        /// \return 关联更新数据
        virtual RegenDataId GetTypeParameterBindingRdId() const = 0;
    };
}



